perm filename UDPFIL.FAI[KID,KMC] blob sn#111194 filedate 1974-11-15 generic text, type T, neo UTF8
TITLE UDPFIL
;THIS A NEW VERSION OF THE PROGRAM TO ACCOMODATE DART.
;THE OLD VERSION (FOR OLD DAEMON) IS CALLED UDPFIL.OLD[KID,RCP]
;THIS PROGRAM READS A FILE (SOSFIL) AND COPIES THE MENTIONED SOUND
;FILES ONTO THE UDP FROM EITHER MTA0, MTA1 OR DSK:.
;THE SOS FILE IS JUST A LIST OF FILE NAMES (WITHOUT EXTENSIONS)
;AND THE SOURCE OF FILES IS DETERMINED BY LINESOF THE FORM
;   *α   (WHERE α=0 ⊃ MTA0
;		α=1 ⊃ MTA1
;		α=2 ⊃ DSK:)
;ALSO A LINE CONSISTING OF     *.    MARKS THE END OF THE SOS FILE.
;[INITIALLY THE SOURCE IS MTA0 AND WILL REMAIN SO UNTIL *1 OR *2
;IS ENCOUNTERED.]

FILNAM:	0			;FILE NAME (IN SIXBIT) TO BE COPIED.
	SIXBIT	/DMD/
	0
	0
SOSFNM:	SIXBIT	/SOSFIL/	;FILE FOR READING DIRECTIONS
	0
	0
	0
FILDEL:	0		;IF NONZERO THEN DELETE THE FILE FROM THE AREA
SRCENO:	0			;0 ⊃ MTA0 ; 1 ⊃ MTA1 ; 2 ⊃ DSK:
PDL:	BLOCK	11
IBUF:	BLOCK	3
DIOWD:	IOWD	0,BUFFER	;FIRST HALF IS OVERWRITTEN
	0
LINUM:	0
NOB:	0
FILTH:	0

UDPCHN	←17
SOSFCH	←16
DSKCHN	←15
MTACHN	←14
PAKST←←1
PAKEND←←=3999

A←1
B←2
C←3
P←7

				;DSK: ALWAYS ASSIGNED - NO EXPENSE.
START:	;FIRST INIT THE UDP.
	INIT	UDPCHN,17	;DUMP MODE IS APPROPRIATE.
	SIXBIT	/UDP/
	0
	JRST	[OUTSTR [ASCIZ /CANNOT INIT UDP/]
		CALL  [SIXBIT /EXIT/]		];CANNOT CONTINUE

	ENTER	UDPCHN,[SIXBIT /KMC/
		0
		0
		0]
	JRST	[OUTSTR [ASCIZ /CURRENT PAK PROTECTED/]
		CALL	[SIXBIT /EXIT/]]

	;NOW GET THE SOS FILE.
	INIT	SOSFCH,1
	SIXBIT	/DSK/
	XWD	0,IBUF
	JRST	[OUTSTR [ASCIZ /CANNOT INIT DSK FOR SOSFIL/]
		CALL  [SIXBIT /EXIT/]		];CANNOT CONTINUE

	LOOKUP	SOSFCH,SOSFNM	;SEEK THE FILE
	JRST	[OUTSTR [ASCIZ /SOSFIL NOT AROUND/]
		CALL  [SIXBIT /EXIT/]	];GUY MUST CREATE THE SOSFILE

	;NOW INITIALISE THE DSK CHANNEL FOR WRITING STUFF FROM TAPE TO THE
	;DISK AND ALSO FROM THE DISK TO THE UDP.
	INIT	DSKCHN,17
	SIXBIT	/DSK/
	0
	JRST	[OUTSTR [ASCIZ /CANNOT INIT DSK: - THE SYSTEM FILE AREA/]
		CALL  [SIXBIT /EXIT/]		];GIVE UP

	MOVE	P,[IOWD	7,PDL]

LOOP:	;LOOP TO OBEY ONE COMMAND OR COPY ONE FILE.
	PUSHJ	P,INCH
	CAIE	A,052		;COMPARE WITH CODE FOR ASTERISK
	JRST	COPFIL		;NOT ASTERISK SO MUST BE FILE NAME
	PUSHJ	P,INCH		;GET COMMAND
	CAIN	A,060
	JRST	SOURCE		;SOURCE IS MTA0
	CAIN	A,061
	JRST	SOURCE		;SOURCE IS MTA1
	CAIN	A,062
	JRST	SOURCE		;SOURCE IS DSK:
	CAIN	A,056
	JRST	WINDUP		;PERIOD SIGNIFIES END OF SOS FILE.
	JRST	[OUTSTR [ASCIZ /ILLEGAL COMMAND/]
		 JRST	PRTLNO]

SOURCE:	SUBI	A,060		;CONVERT TO 0,1,2
	MOVEM	A,SRCENO	;SOURCE NUMBER.
	PUSHJ	P,INCH
	CAIE	A,012
	JRST	[OUTSTR [ASCIZ /OVERLENGTH COMMAND/]
		JRST	PRTLNO]
	JRST	LOOP

WINDUP:				;END OF SOS FILE REACHED.
	;CLOSE SOS FILE
	RELEAS	SOSFCH

	;CLOSE UDP
	RELEAS	UDPCHN

	;CLOSE SYSTEM FILE AREA CHANNEL
	RELEAS	DSKCHN

	CALL	[SIXBIT /EXIT/]

COPFIL:				;COPY ONE FILE FROM SOURCE TO UDP.
	;START BY READING FILE NAME AND CONVERTING TO SIXBIT.
	PUSHJ	P,CHKALN	;CHECK THAT THIS CH IS ALPHANUMERIC
	LSH	A,=30		;FIRST CHARACTER TO TOP OF WORD.
	MOVEM	A,FILNAM
	MOVEI	C,=24		;MAY LOOP 5 TIMES (DECREMENT = 6).
FNAMLP:	PUSHJ	P,INCH 		;GET NEXT CHAR.
	CAIN	A,012		;TEST FOR LINE FEED
	JRST	FNAMFD		;JUMP OUT OF NAME LOOP AT END OF LINE.
	PUSHJ	P,CHKALN	;CHECK THAT THIS CH IS ALPHANUMERIC
	LSH	A,0(C)		;MOVE CHAR UPSTREAM
	ORM	A,FILNAM	;PUT CHAR IN MEMORY
	SUBI	C,=6
	JUMPGE	C,FNAMLP
	PUSHJ	P,INCH		;GET CHARACTER.
	CAIE	A,012		;TEST FOR LINE FEED.
	JRST	[OUTSTR	[ASCIZ /OVERLENGTH FILE NAME/]
		JRST	PRTLNO]

FNAMFD:	SETZM	FILDEL		;DONT DELETE UNLESS FILE GETS CREATED.

	;NOW BRANCH ON SOURCE.
	MOVE	A,SRCENO	;GET SOURCE NUMBER.
	JUMPE	A,MT0FIL
	SUBI	A,1
	JUMPE	A,MT1FIL
	SUBI	A,1
	JUMPE	A,DSKFIL
	CALL  [SIXBIT /EXIT/]

MT0FIL:	;FILE IS TO BE FOUND ON MTA0.
	INIT	MTACHN,117	;DUMP MODE APPROPRIATE.
	;ALSO IONRCK IS SET.
	SIXBIT	/MTA0/
	0
	JRST	[OUTSTR [ASCIZ /WHAT HAPPENED TO MTA0/]
		JRST	MT0FIL]
	JRST	MTREAD

MT1FIL:	;FILE IS TO BE FOUND ON MTA1.
	INIT	MTACHN,117	;DUMP MODE APPROPRIATE.
	SIXBIT	/MTA1/
	0
	JRST	[OUTSTR [ASCIZ /WHAT HAPPENED TO MTA1/]
		JRST	MT1FIL]

MTREAD:	;READ THE NOMINATED FILE FROM A MAGTAPE.
	;A NOTE ON DART TAPE FORMAT:-
	;EACH FILE IS A SERIES OF (UP TO) 1280 WORD RECORDS (2400 OCTAL)
	;THE FIRST (LAST) RECORD OF EACH TAPE IS A HEADER (TRAILER):
	;  TOP HALF OF WORD 0 OF HEADERS (TRAILERS) IS POSITIVE.
	;THE FIRST RECORD OF EACH FILE IS A FILE-START RECORD.
	;  THE TOP HALF OF WORD 0 OF FILE-START RECORDS IS -1.
	;  WORD 2 OF FILE-STARTERS IS THE FILE NAME.
	;  WORD 3 (TOP) OF FILE-STARTERS IS THE EXTENSION.
	;CONTINUATION RECORDS FOR A FILE CONTAIN 0 IN TOP OF WD 0.

	;SEEK NEXT FILE-START RECORD.
	SETZM	BUFFER		;WILL BE OVERWRITTEN BY HEADER.
	GETSTS	MTACHN,A	;FOR RAIDING
	INPUT	MTACHN,[IOWD =1280,BUFFER
			0]
	GETSTS	MTACHN,A	;FOR RAIDING
	MOVE	A,BUFFER+2	;TEST FOR TAPE TRAILER
	CAMN	A,[SIXBIT /*TAIL*/]
	JRST	[OUTSTR [ASCIZ /TRAILER RECORD FOUND/]
		CALL [SIXBIT /EXIT/]]
	MOVE	A,BUFFER	;TEST FOR FILE-STARTER
	JUMPGE	A,MTREAD
	MOVE	A,BUFFER+2	;FILE NAME OF FILE-STARTER
	CAME	A,FILNAM	;SKIP IF FILE FOUND
	JRST	MTREAD

	;COPY THE FILE FROM MTAPE TO DISK
	MOVE	A,[SIXBIT /DMD/]
	MOVEM	A,FILNAM+1
	SETZM	FILNAM+2
	SETZM	FILNAM+3
	ENTER	DSKCHN,FILNAM	;CREATE A FILE
	JRST	[OUTSTR [ASCIZ /LOUSY FILE NAME - I GUESS/]
		JRST	PRTLNO	];PRINT LINE NO.
	SETOM	FILDEL		;FILE CREATED HERE SO DELETE LATER.
	;NOW COPY THE FILE ON TAPE INTO THIS FILE.
	SETZM	SCRPLT		;LENGTH OF SCRAP IS 0
CLOOP:	MOVEI	A,BUFFER
	ADD	A,SCRPLT	;DESTINATION ADDRESS.
	MOVE	B,A
	ADDI	B,=17		;WILL OVERWRITE THE 17 JUNK WORDS.
	MOVEI	C,=1007		;NO. OF INFO WORDS.
	PUSHJ	P,MOOV		;MOVE CORE.
	MOVEI	A,=1007
	ADD	A,SCRPLT	;NO. OF WORDS OF INFO
	IDIVI	A,=128		;COMPUTE NO. OF DISK BLOCKS.
	MOVEM	B,SCRPLT	;NEW VALUE OF SCRAP LENGTH.
	IMULI	A,=128		;NO. OF WORDS TO BE WRITTEN.
	MOVEM	A,OFFSET	;ADDRESS OF NEW SCRAP
	MOVN	A,A
	HRLM	A,DIOWD		;-WORD COUNT.

	OUTPUT	DSKCHN,DIOWD	;OUTPUT =1024 OR =992 WORDS FROM BUFFER.
	MOVEI	A,BUFFER	;DESTINATION FOR NEW SCRAP
	MOVEI	B,BUFFER
	ADD	B,OFFSET	;SOURCE ADDRESS.
	MOVE	C,SCRPLT	;NO OF WORDS TO MOVE
	PUSHJ	P,MOOV		;PUT THE SCRAP AT BUFFER.
	MOVEI	A,BUFFER-1
	ADD	A,SCRPLT	;FORM (BUFFER+[SCRAPLENGTH] - 1)
	HRRM	A,NIOWD		;WILL READ AT THIS LOCATION.
	INPUT	MTACHN,NIOWD
	MOVEI	A,BUFFER+=10
	ADD	A,SCRPLT	;ADDRESS OF FILE NAME.
	MOVE	A,0(A)		;THE FILE NAME.
	CAME	A,FILNAM	;TEST FOR CONTINUATION BLOCK.
	JRST	CLOOPX		;ESCAPE LOOP.
	JRST	CLOOP

CLOOPX:	MOVN	A,SCRPLT	;NO OF WORDS IN SCRAP.
	ADD	A,=128		;ENSURE PARTIAL DISK BLOCK IS WRITTEN.
	HRLM	A,DIOWD		;NO. OF WORDS TO WRITE.
	OUTPUT	DSKCHN,DIOWD	;WRITE SCRAP + SOME JUNK
	MTAPE	MTACHN,7	;BACKSPACE A RECORD.


	RELEAS	MTACHN,0	;IF WE NEED THIS UNIT LATER IT WILL BE
				;RE-ASSIGNED AT THAT TIME.
	CLOSE	DSKCHN,0


DSKFIL:	;THERE IS A FILE ON THE DISK WITH NAME IN 'FILNAM' WHICH MUST BE COPIED
	;ONTO THE UDP AND THEN PERHAPS DELETED.

	;LOOKUP THE FILE ON THE SYSTEM FILE AREA
	MOVE	A,[SIXBIT /DMD/]
	MOVEM	A,FILNAM+1	;EXTENSION IS DMD.
	SETZM	FILNAM+2
	SETZM	FILNAM+3
	LOOKUP	DSKCHN,FILNAM
	JRST	[OUTSTR [ASCIZ /CANNOT FIND FILE ON DISK/]
		JRST	PRTLNO]
	
	;FIRST 200 WORDS ARE JUNK SO DISCARD ALL EXCEPT
	;THE 1ST WHICH CONTAINS THE LENGTH OF THE SOUND INFO.
	INPUT	DSKCHN,[IOWD 200,BUFFER
			0]	;READ THE 1ST 200 WORDS.
	MOVE	A,BUFFER	;SOUND INFO LENGTH
	SUBI	A,200
	MOVEM	A,FILTH		;SAVE FILE LENGTH.
	IDIVI	A,=2336
	SKIPE	B		;SKIP IF INFO EVEN NO. OF BLOCKS
	ADDI	A,1		;PART OF A BLOCK USES A BLOCK
	MOVEM	A,NOB		;SAVE NUMBER OF BLOCKS

	;NOW CHECK UDP DIRECTORY IS EXPANDABLE.
	INPUT	UDPCHN,[IOWD	=2336,DIRECT
			PAKST]
	;THE FIRST WORD OF THE DIRECTORY IS THE NO. OF ENTRIES.
	;THE SECOND CONTAINS THE DATE LAST WRITTEN.
	;THE THIRD WORD GIVES NEXT AVAILABLE BLOCK NUMBER
	;THE FOURTH WORD IS SPARE.
	;THUS WORDS 4 THRU 2335 ARE FOR AT MOST 1165 ENTRIES.
	;THE 2 WORD ENTRY FORMAT IS AS FOLLOWS:-
	;  1ST WORD - FILENAME.
	;  2ND WORD (TOP) - FILE LENGTH
	;  2ND WORD (BOTTOM) - STARTING BLOCK NUMBER.

	MOVE	A,DIRECT	;NO. OF ENTRIES
	CAIL	A,=1164		;TEST FOR OVERFLOW
	JRST	[OUTSTR [ASCIZ /UDP FULL/]
		 JRST PRTLNO]
	MOVE	B,DIRECT+2	;THIRD WORD (NEXT FREE BLOCK)
	ADD	B,NOB		;WILL BE NEW VALUE SOON
	CAIL	B,PAKEND	;WILL NOT FILL LAST BLOCK
	JRST	[OUTSTR	[ASCIZ /UDP WILL OVERFLOW/]
		 JRST PRTLNO]

	;EXPAND THE UDP DIRECTORY.
	ADDI	A,1
	MOVEM	A,DIRECT	;UPDATE NO OF ENTRIES.
	LSH	A,1		;DOUBLE THIS NUMBER TO GET WORD COUNT.
	ADDI	A,2		;GET ADDRESS OF NEXT ENTRY.
	MOVE	B,FILNAM	;NAME OF NEW FILE.
	MOVEM	B,DIRECT(A)	;NAME IS FIRST WORD OF NEW ENTRY.
	MOVE	B,DIRECT+2	;STARTING BLOCK
	HRL	B,FILTH		;GET FILE LENGTH
	MOVEM	B,DIRECT+1(A)	;SECOND WORD OF NEW FILE ENTRY
	MOVE	B,DIRECT+2	;STARTING BLOCK
	MOVEM	B,UDPBNO	;MAKE COPY
	ADDI	B,1
	MOVEM	B,UDPBN2
	ADDI	B,1
	MOVEM	B,UDPBN3
	ADDI	B,1
	MOVEM	B,UDPBN4
	MOVE	A,NOB		;NUMBER OF BLOCKS USED BY THIS FILE.
	ADDM	A,DIRECT+2	;UPDATE THIRD WORD OF DIRECTORY.
	CALL	A,[SIXBIT /DATE/]
	MOVEM	A,DIRECT+1	;UPDATE DATE
	;THE NEW VERSION OF THE DIRECTORY IS DONE BUT WILL NOT
	;BE COMMITTED TO UDP UNTIL THE FILE IS SUCCESSFULLY OUT.

	;PREPARE TO LOOP ([NOB]-1)/4 TIMES TO WRITE X BLOCKS.
	;     WHERE X = ([NOB]-1)/4 *4.
	MOVE	A,NOB
	SUBI	A,1
	LSH	A,-2		;DIVIDE BY 4
	JRST	WLOOPX
WLOOP:	INPUT	DSKCHN,[IOWD =9344,BUFFER
			0]
	OUTPUT	UDPCHN,UDPIOW
	OUTPUT	UDPCHN,UDPIO2
	OUTPUT	UDPCHN,UDPIO3
	OUTPUT	UDPCHN,UDPIO4
	SUBI	A,1		;DECREMENT LOOP COUNT
	MOVEI	B,4
	ADDM	B,UDPBNO	;BUMP THE BLOCK NUMBER
	ADDM	B,UDPBN2	;BUMP THE OTHER BLOCK NUMBERS
	ADDM	B,UDPBN3	;BUMP THE OTHER BLOCK NUMBERS
	ADDM	B,UDPBN4	;BUMP THE OTHER BLOCK NUMBERS
	MOVE	B,FILTH		;LENGTH YET TO WRITTEN
	SUBI	B,=9344		;UPDATE
	MOVEM	B,FILTH		;PUT IT WHERE IT COUNTS.
WLOOPX:	JUMPG	A,WLOOP
	;FALLS THRU WHEN (([NOB]-1 )/ 4)* 4 BLOCKS HAVE BEEN WRITTEN.
	;THERE ARE AT MOST 4 BLOCKS YET TO WRITE.
	SETZM	BUFFER
	MOVEI	0,BUFFER+1
	HRLI	0,BUFFER
	BLT	0,BUFFER+=9344	;ZERO BUFFER
	MOVN	A,FILTH		;NUMBER OF WORDS LEFT.
	HRLM	A,DIOWD		;CUSTOM BUILT IOWD.
	MOVE	A,FILTH		;NO. OF WORDS TO BE WRITTEN.
	INPUT	DSKCHN,DIOWD
	OUTPUT	UDPCHN,UDPIOW
	SUBI	A,=2336		;2336 WORDS WERE JUST SCRAWLED.
	JUMPLE	A,ALLOUT
	OUTPUT	UDPCHN,UDPIO2	;NEXT 2336 WORDS.
	SUBI	A,=2336		;2336 WORDS WERE JUST SCRAWLED.
	JUMPLE	A,ALLOUT
	OUTPUT	UDPCHN,UDPIO3	;NEXT 2336 WORDS.
	SUBI	A,=2336		;2336 WORDS WERE JUST SCRAWLED.
	JUMPLE	A,ALLOUT
	OUTPUT	UDPCHN,UDPIO4	;NEXT 2336 WORDS.
ALLOUT:	;WHEN CONTROL FALLS THRU THE FILE HAS BEEN COPIED TO THE UDP

	OUTPUT	UDPCHN,[IOWD =2336,DIRECT
			PAKST]	;WRITE NEW COPY OF DIRECTORY

	;NOW DECIDE ON DELETING THE DISK VERSION OF THE FILE.
	MOVE	FILDEL
	JUMPE	.+3		;SKIP IF NOT TO BE DELETED.
	RENAME	DSKCHN,[0↔0↔0↔0]
	JRST	[OUTSTR	[ASCIZ /RENAME DISASTER/]
		 CALL  [SIXBIT /EXIT/]]

	CLOSE	DSKCHN,0
	JRST	LOOP		;GO GET NEXT COMMAND.


PRTLNO:	;PRINT LINE NUMBER AND FAIL.
	MOVEI	A,040		;SPACE
	OUTCHR	A
	OUTCHR	A
	MOVE	A,LINUM
	IDIVI	A,=10000
	ADDI	A,060
	OUTCHR	A
	MOVE	A,B
	IDIVI	A,=1000
	ADDI	A,060
	OUTCHR	A
	MOVE	A,B
	IDIVI	A,=100
	ADDI	A,060
	OUTCHR	A
	MOVE	A,B
	IDIVI	A,=10
	ADDI	A,060
	OUTCHR	A
	MOVE	A,B
	ADDI	A,060
	OUTCHR	A
	CALL	[SIXBIT /EXIT/]

INTMP:	0			;NONZERO WHEN THE LINE NUMBER HAS BEEN FOUND.
INCH:	;SUBROUTINE TO READ ONE CHARACTER FROM THE SOS FILE.
	;THIS FILE SHOULD HAVE LINE NUMBERS TERMINATED BY A TAB
	;(ie BE A GARDEN VARIETY SOS FILE).

	PUSHJ	P,INCH8
	CAIE	A,012		;TEST FOR LINE FEED.
	JRST	.+3		;NORMAL CHARACTER.
	SETZM	INTMP
	POPJ	P,		;EXIT.
	SKIPE	INTMP
	POPJ	P,		;EXIT FOR ANY CHAR AFTER LINE NUMBER.
	;THE CHAR IN A SHOULD BE THE FIRST DIGIT OF A LINE NUMBER.
	PUSHJ	P,CHKDIG
	MOVEM	A,LINUM
NUMLP:	PUSHJ	P,INCH8		;NEXT CHAR
	CAIN	A,011		;TEST FOR TAB
	JRST	FOUND
	PUSHJ	P,CHKDIG	;CHECK FOR DIGIT (AND RECODE)
	MOVEI	B,=10
	IMUL	B,LINUM		;MULTIPLY LAST PARTIAL LINE NO. BY 10
	ADD	A,B
	MOVEM	A,LINUM		;NEW PARTIAL LINE NUMBER.
	JRST	NUMLP

FOUND:	;LINUM CONTAINS THE LINE NUMBER.
	SETOM	INTMP		;INDICATE LINE NUMBER FOUND.
	JRST	INCH		;TRY AGAIN.


INCH8:	;READ A CHARACTER FROM SOSFCH.
	SOSG	IBUF+2
	IN	SOSFCH,
	JRST	INCH9
	STATO	SOSFCH,20000	;TEST FOR ENDFILE.
	JRST	[OUTSTR [ASCIZ /HARDWARE FAILURE READING SOSFIL/]
		 CALL  [SIXBIT /EXIT/]]
	OUTSTR	[ASCIZ /ENDFILE DETECTED ON SOSFIL/]
	CALL	[SIXBIT /EXIT/]

INCH9:	ILDB	A,IBUF+1
	CAIN	A,015		;TEST FOR CARRIAGE RETURN CHARACTER.
	JRST	INCH8		;FOUND SO GET NEXT.
	JUMPE	A,INCH8		;GET NEXT IF TXIS IS NULL CHARACTER.
	POPJ	P,		;ELSE DELCLARE VICTORY AND QUIT.


CHKDIG:	;CHECK CHAR IN A IS A DIGIT AND RECODE SO CODE(0)=0.
	SUBI	A,060		;RECODE.
	JUMPL	A,NOTDIG	;IF A < 0 THEN ORIG CHAR WAS NOT DIGIT.
	CAILE	A,=9
	JRST	NOTDIG		;A>9 SO ORIG CHAR WAS NOT DIGIT.
	POPJ	P,		;GET OUT
NOTDIG:	OUTSTR	[ASCIZ /BAD LINE NUMBER/]
	CALL	[SIXBIT /EXIT/]



CHKALN:	;CHECK CHAR IN A IS ALPHANUMERIC AND RECODE TO SIXBIT.
	SUBI	A,040		;RECODE.
	CAIGE	A,020		;TEST AGAINST RECODED 0.
	JRST	NOTALN
	CAIG	A,031		;TEST AGAINST RECODED 9.
	JRST	ISALN
	CAIGE	A,041		;TEST AGAINST RECODED A.
	JRST	NOTALN
	CAIG	A,072		;TEST AGAINST RECODED R.
	JRST	ISALN
NOTALN:	OUTSTR	[ASCIZ /NONALPHANUMERIC CHAR IN NAME/]
	JRST	PRTLNO
ISALN:	POPJ	P,		;DECLARE VICTORY AND GET OUT.


MOOV:	;MOVE THE BLOCK OF WORDS WHOSE LENGTH IS GIVEN IN C
	;FROM THE ADDRESS IN B DOWN CORE TO THE ADDRESS IN A.
	JUMPLE	C,MOOVX		;EXIT IS NO WORDS LEFT.
	MOVE	0,0(B)		;GET NEXT
	MOVEM	0,0(A)		;PUT IT
	ADDI	A,1
	ADDI	B,1		;BOTH POINTERS INCREMENTED.
	SUBI	C,1		;DECREMENT COUNT
	JRST	MOOV		;CONTINUE TO LOOP

MOOVX:	POPJ	P,		;EXIT



DIRECT:	BLOCK	=2594		;1 UDP BLOCK + 2 WDS
BUFFER:	BLOCK	=9346		;4 UDP BLOCK + 2 WDS
SCRPLT:	0			;CONTAINS LENGTH OF LEFTOVERS.
OFFSET:	0			;GIVES LOCATION OF SCRAPS.

NIOWD:	IOWD	=1024,0		;ADDRESS WILL BE COMPUTED.
	0

UDPIOW:	IOWD	=2336,BUFFER
UDPBNO:	0			;CURRENT BLOCK NUMBER.
UDPIO2:	IOWD	=2336,BUFFER+=2336
UDPBN2:	0
UDPIO3:	IOWD	=2336,BUFFER+=4672
UDPBN3:	0
UDPIO4:	IOWD	=2336,BUFFER+=7008
UDPBN4:	0


END START